if(!window.mc){
	window.mc = function(){};
}
window.mc.inputer = function(){};

mc.inputer.init = function(input){
	mc.inputer.txt = input;
	return function(obj,data){
		mc.inputer.process(data);
		return false;
	};
}
mc.inputer.parse_command = function(msg){
	var m;
	if((m = msg.match(/^\s*[\/\.](\S+)(?:\s+(\S+))?(?:\s+(\S+))?(?:\s+(\S+))?(?:\s+(\S+))?/))){
		switch(m[1]){
			case "help":
			case "рудз":
				return ""+
				"Доступные команды:<br>"+
				"<a class=cmd href=\"#\">/who</a> - мой ник<br>"+
				"<a class=cmd href=\"#\">/exit</a> - выход<br>" +
				"<a class=cmd href=\"#\">/clear</a> - очистка сообщений<br>" +
				"Личное сообщение: <a class=inp href=\"#\">private[ник]</a> сообщение<br>"+
				"Личное сообщение: <a class=inp href=\"#\">лично[ник]</a> сообщение<br>"+
				"Адресное сообщение: <a class=inp href=\"#\">to[ник]</a> сообщение<br>"+
				"Адресное сообщение: <a class=inp href=\"#\">для[ник]</a> сообщение<br>";
			case "who":
			case "црщ":
				return "Ваш логин: <b>"+mc.main.login+"</b>";
			case "list":
			case "дшые":
				return {"cmd":"list","chanel": (m[2] ? m[2] : mc.main.chanel)};
			case "clear":
			case "сдуфк":
				mc.tape.clear();
				return "теперь чисто";
			case "учше":
			case "exit":
				top.location = "/";
				return "выходим";
			case "loop":
				(function(m){
					var f;
					var a = m[2];
					var b = m[3] || 1;
					var c = m[4] || 100;
					var d = 0;
					var s;
					f = function(){
						mc.cmd.run(a);
						if(b > ++d){
							window.setTimeout(f,c);
						}else{
							var e = new Date();
							var diff = e.getTime() - s.getTime();
							var speed = b / diff * 1000;
							mc.tape.put_console("Закончили за " + (Math.round(diff/100)/10)+" cек. Скорость " + Math.round(speed) + " вызов/сек");
						}
					};
					s = new Date();
					f();
				})(m);
				return "поехали: "+  msg;
		}
	}
	mc.inputer.parse_error = true;
	return false;
}
mc.inputer.parse_message = function(msg){
	var message = {};
	var m;
	if((m = msg.match(/^!([\w\s,а-яА-ЯёЁ]+)(.*)/))){
		message.chanel = m[1];
		msg = m[2];
	}else{
		message.chanel = mc.main.chanel;
	}
	if((m = msg.match(/(?:private|лично)\s*\[([\w\s,а-яА-ЯёЁ]+)\](.*)/))){
		var list = m[1].split(",");
		for(var i = 0; i< list.length; i++){
			list[i] = list[i].replace(/^\s+/,"").replace(/\s+$/,"");
		}
		if(m[2] && m[2].match(/\S/)){
			return {"cmd":"private","text": msg,"to":list};
		}else{
			return false;
		}
	}else if(msg.match(/(?:to|для)\s*\[[\w\s,а-яА-ЯёЁ]+\]\s*$/)){
		return false;
	}else if(msg.match(/\S/)){
		message.cmd = "message";
		message.text = msg;
		return message;
	}else{
		return false;
	}
}
mc.inputer.parse = function(msg){
	mc.inputer.parse_error = false;
	if(msg.match(/^\s*[\/\.]/)){
		return mc.inputer.parse_command(msg);
	}else{
		return mc.inputer.parse_message(msg);
	}
}
mc.inputer.strip_html = function(found,chr){
	switch(chr){
		case '<':
			return "&lt;";
		case '>':
			return "&gt;";
		case '&':
			return "&amp;";
		default:
			return chr;
	}
}
// основной вызов, выполняет переданную строку или строку ввода
mc.inputer.process = function(force) {
	try {
		if(!force){
			force = mc.inputer.txt.val();
		}
		if(force != ""){
			var msg;
			if((msg = mc.inputer.parse(force))){
				if(typeof(msg) == "string"){
					mc.tape.put_console(msg);
					mc.inputer.rewrite();
				}else{
					mc.transport.send_message(msg);
				}
			}else if(mc.inputer.parse_error){
				mc.tape.put_console("плохая строка: " + force.replace(/([<>&])/g,mc.inputer.strip_html));
				mc.inputer.focus();
			}else{
				mc.inputer.focus();
			}
		}
	}catch(e) {
		mc.tape.put_console("Catch(" + e + ") input: " + force.replace(/([<>&])/g,mc.inputer.strip_html));
	}
}

mc.inputer.callback_replace = function(found,cmd,list){
	mc.inputer.inserted = true;
	var ary = list.split(",");
	var p = false;
	for(var i = 0; i< ary.length; i++){
		ary[i] = ary[i].replace(/^\s+/,"").replace(/\s+$/,"");
		if(ary[i] == mc.inputer.tmp_login){
			p = true;
		}
	}
	if(!p){
		ary.push(mc.inputer.tmp_login);
	}
	return cmd + "[" + ary.join(",") + "]";
}
// вставляет переданный логин как адресат указанного типа
mc.inputer.insert_login = function(login,priv){
	var v = mc.inputer.txt.val();
	mc.inputer.tmp_login = login;
	mc.inputer.inserted = false;
	var nv = v.replace(/(private|to|для|лично)\s*\[([\w\sа-яА-Я,ёЁ]+)\]/,mc.inputer.callback_replace);
	if(!mc.inputer.inserted){
		if(priv){
			nv = "лично";
		}else{
			nv = "для";
		}
		nv += "[" + login +"] " + v;
	}
	mc.inputer.rewrite(nv);
}
mc.inputer.current = function(str){
	return mc.inputer.txt.val();
}
// перезаписываетстроку ввода заданной строкой
mc.inputer.rewrite = function(msg){
	if(!msg){
		msg = "";
	}
	var l = msg.length;
	mc.inputer.txt.val(msg).focus().caret(l,l);
}
// вставляет переданную строку в текущую позицию курсора
mc.inputer.insert = function(str){
	var value = mc.inputer.txt.focus().caret().replace(str);
	mc.inputer.txt.val(value);
}
mc.inputer.focus = function(){
	mc.inputer.txt.focus();
}
